#!/usr/bin/env python3
import argparse
from PIL import Image
import sys


def create_two_frame_gif(frame1_path, frame2_path, output_path):
    """
    创建一个两帧的GIF动画，播放到第二帧时停住

    参数:
        frame1_path: 第一帧图片路径
        frame2_path: 第二帧图片路径  
        output_path: 输出GIF路径
    """
    try:
        # 打开两张图片
        frame1 = Image.open(frame1_path)
        frame2 = Image.open(frame2_path)

        # 确保图片尺寸一致，如果不一致则调整到第一帧的尺寸
        if frame1.size != frame2.size:
            print(f"警告: 图片尺寸不一致，将第二帧调整到第一帧尺寸 {frame1.size}")
            frame2 = frame2.resize(frame1.size, Image.Resampling.LANCZOS)

        # 创建GIF动画
        # duration: 每帧显示时间(毫秒)
        # loop: 0表示无限循环，1表示播放一次后停在最后一帧
        frames = [frame1, frame2]

        # 注意：GIF格式限制在256色，无法完全还原真彩色原图质量
        # 使用最佳颜色量化方法尽可能接近原图质量
        # 将两张图片转换为P模式（调色板模式）并使用自适应调色板
        frame1_paletted = frame1.convert('P', palette=Image.Palette.ADAPTIVE, colors=256)
        frame2_paletted = frame2.convert('P', palette=Image.Palette.ADAPTIVE, colors=256)

        frames_paletted = [frame1_paletted, frame2_paletted]

        # 保存为GIF，设置在第二帧停住
        frames_paletted[0].save(
            output_path,
            save_all=True,
            append_images=frames_paletted[1:],
            duration=[1, 65535],
            loop=1,                # 播放一次后停止
            disposal=2,            # 每帧显示后恢复背景
            optimize=True,         # 优化文件大小但保持质量
        )

        # print(f"成功创建GIF: {output_path}")
        # print(f"第一帧: {frame1_path}")
        # print(f"第二帧: {frame2_path}")
        # print(f"GIF将在第二帧停住")

    except FileNotFoundError as e:
        print(f"错误: 找不到文件 - {e}")
        sys.exit(1)
    except Exception as e:
        print(f"错误: {e}")
        sys.exit(1)


def main():
    # 设置命令行参数解析
    parser = argparse.ArgumentParser(
        description="创建一个两帧的GIF动画，播放到第二帧时停住",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
示例用法:
    python app.py frame1.png frame2.png output.gif
    python app.py /path/to/image1.jpg /path/to/image2.png /path/to/animation.gif
        """
    )

    parser.add_argument("frame1", help="第一帧图片路径")
    parser.add_argument("frame2", help="第二帧图片路径")
    parser.add_argument("output", help="输出GIF文件路径")

    # 解析参数
    args = parser.parse_args()

    # 创建GIF
    create_two_frame_gif(args.frame1, args.frame2, args.output)


if __name__ == "__main__":
    main()
